#include <stdio.h> 
#include <stdlib.h>
#include <string.h>



/*
三、简单开辟内存
1、申请
malloc(参数:字节总数)
calloc(参数:单个字节数，个数)
2、释放
free(参数:首地址)
3、注意事项
在堆区开辟的内存
不释放:内存泄漏
不置空:野指针
*/

int main()
{
    //1、申请malloc
    //一、 申请一个double类型大小的内存(8字节)
    double* p1=(double*)malloc(sizeof(double));
    *p1=3.14;
    printf("%f %p\n",*p1,p1);
    //2、使用
    //3、释放
    free(p1);
    //4、置空
    p1=NULL;

    //二、 申请十个double类型大小的连续内存(8字节)
    p1=(double*)malloc(sizeof(double)*10);
    //2、使用
    /*
    p1:存申请的内存的首地址
    在一次申请中，申请的内存是连续的,类似一个数组
    ===》指针偏移或者改指向
    *(p+n) <===> p[n]  
    */
    for(int i=0;i<10;i++)
    {
        p1[i]=10+i;
        printf("p1[%d]:%lf %p %lf\n",i,p1[i],p1+i,*(p1+i));
    }
    printf("%f %p\n",*p1,p1);
    printf("%f %p\n",*(p1+2),p1+2);
    //3、释放
    free(p1);
    //4、置空
    p1=NULL;

    //1、申请calloc
    //一、 申请一个float类型大小的内存(8字节)
    float* p2=(float*)calloc(sizeof(float),1);
    *p2=3.15;
    printf("%f %p\n",*p2,p2);
    //2、使用
    //3、释放
    free(p2);
    //4、置空
    p2=NULL;


    //二、 申请5个float类型大小的连续内存(8字节)
    p2=(float*)calloc(sizeof(float),5);
    //2、使用
    /*
    p1:存申请的内存的首地址
    在一次申请中，申请的内存是连续的,类似一个数组
    ===》指针偏移或者改指向
    *(p+n) <===> p[n]  
    */
    for(int i=0;i<5;i++)
    {
        p2[i]=100+i;
        printf("p2[%d]:%lf %p %lf\n",i,p2[i],p2+i,*(p2+i));
    }
    printf("%f %p\n",*p2,p2);
    printf("%f %p\n",*(p2+2),p2+2);
    //3、释放
    free(p2);
    //4、置空
    p2=NULL;

	//system("pause");
	return 0;
} 